<?php
/**
 * Скрипты получения из бд и последующего вывода информации.
 *
 * @package    gbook
 * @category   interface
 * @copyright  2013 Nikolay Konovalov
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

/**
 * Класс для отображения сообщений и комментариев из базы данных в виде HTML-кода
 *
 * @package    gbook
 * @category   interface
 * @copyright  2013 Nikolay Konovalov
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
global $CFG;
require_once ($CFG->dirroot . '/blocks/dof/im/gbook/lib/forms.php');

class gbook_generate_html
{

    /** 
     * Генерирует HTML-код для вывода сообщений гостевой книги с комментариями
     * 
     * Подключается к базе данных через плагин типа storage, получает список
     * сообщений в порядке от новых к старым, генерирует HTML-код для форм;
     * для каждого сообщения получает список комментариев в порядке от старых
     * к новым и выводит их сразу после сообщения, к которому они были сделаны
     * 
     * @access public
     * @return string html-строка с формами сообщениий и комментариев
     */
    public function show_guestbook_messages()
    {
        global $DOF;
        $submitform = new form_submit(null, array(
            'messageid' => 0,
            'commentid' => 0,
            'message' => 'Write your message here...',
            'author' => 'Anonymous',
            'action' => 'submitbutton'
        ));
        $messages = $DOF->storage('gbmessages')->get_all_messages();
        ob_start();
        $submitform->display();
        foreach ($messages as $message)
        {
            //get comments
            $commentstomsg = $DOF->storage('gbcomments')->get_all_comments_to_message($message->id);
            $msgform = new form_message(null, array(
                'messageid' => $message->id,
                'message'   => $message->text,
                'author'    => $message->author,
                'datetime'  => $message->datetime,
                'buttons'   => true));
            $msgform->display();
            // display comments:
            foreach ($commentstomsg as $commentary)
            {
                
                $cmtform = new form_comment(null, array(
                    'messageid' => $message->id,
                    'commentid' => $commentary->id,
                    'message'   => $commentary->text,
                    'author'    => $commentary->author,
                    'datetime'  => $commentary->datetime,
                    'buttons'   => true));
                $cmtform->display();                
            }
        }
        $html = ob_get_contents();
        ob_end_clean();
        return $html;
    }

    /**
     * Генерация сообщения с номером $msgid и всех комментариев к нему
     * 
     * Через плагин типа storage получает искомое сообщение и комментарии к нему,
     * генерирует HTML-код и возвращает его
     * 
     * @access public
     * @param integer $msgid номер сообщения, к которому необходимо отобразить комментарии
     * @return string html-строка с нужными формами
     */
    public function show_source_message_with_comments($msgid)
    {
        global $DOF;
        $message = $DOF->storage('gbmessages')->get_message_by_id($msgid);
        ob_start();
        // получаем комментарии
        $commentstomsg = $DOF->storage('gbcomments')->get_all_comments_to_message($message->id);
        $msgform = new form_message(null, array(
            'messageid' => $message->id,
            'message'   => $message->text,
            'author'    => $message->author,
            'datetime'  => $message->datetime,
            'buttons'   => false));
        $msgform->display();
        // отображаем в виде html-формы
        foreach ($commentstomsg as $commentary)
        {

            $cmtform = new form_comment(null, array(
                'messageid' => $message->id,
                'commentid' => $commentary->id,
                'message'   => $commentary->text,
                'author'    => $commentary->author,
                'datetime'  => $commentary->datetime,
                'buttons'   => false));
            $cmtform->display();                
        }
        $html = ob_get_contents();
        ob_end_clean();
        return $html;        
    }

    /**
     * Генерирует и возвращает HTML-код сообщения, указанного в качестве аргумента функции
     * 
     * @access public
     * @param integer $msgid номер сообщения
     * @param boolean $buttons выводить ли кнопки Comment, Edit, Delete на форме
     * @return string html-строка с формой сообщения
     */
    public function show_message_by_id($msgid, $buttons=TRUE)
    {
        global $DOF;
        $message = $DOF->storage('gbmessages')->get_message_by_id($msgid);
        ob_start();
        $msgform = new form_message(null, array(
            'messageid' => $message->id,
            'message'   => $message->text,
            'author'    => $message->author,
            'datetime'  => $message->datetime,
            'buttons'   => $buttons));
        $msgform->display();
        $html = ob_get_contents();
        ob_end_clean();
        return $html;        
    }

    /**
     * Генерирует и возвращает HTML-код формы отправки/редактирования сообщений/комментариев
     * 
     * @access public
     * @param integer $msgid номер сообщения, к которому сделан комментарий
     * @param integer $cmtid номер комментария
     * @param string $action вид действия:
     *     comment - комментирование сообщения, требуется $msgid и $cmtid
     *     editcmt - редактирование комментария, требуется $msgid и $cmtid
     *     editmsg - редактирование сообщения, требуется $msgid
     *     submitbutton - форма отправки сообщения
     * @return string html-строка с формой
     */
    public function show_submit_form($msgid=0, $cmtid=0, $action='submitbutton')
    {
        global $DOF;
        
        switch ($action)
        {
            case 'editmsg':
                $message = $DOF->storage('gbmessages')->get_message_by_id($msgid);
                break;

            case 'editcmt':
                $message = $DOF->storage('gbcomments')->get_commentary_by_id($msgid, $cmtid);
                break;

            default:
                $message = new stdClass();
                $message->text = 'Enter your message here...';
                $message->author = 'Anonymous';           
                break;
        }
        ob_start();
        $submitform = new form_submit(null, array(
            'messageid' => $msgid,
            'commentid' => $cmtid,
            'message' => $message->text,
            'author' => $message->author,
            'action' => $action
        ));
        $submitform->display();
        $html = ob_get_contents();
        ob_end_clean();
        return $html;        
    }

    /**
     * Генерирует и возвращает HTML-код комментария, указанного в качестве аргумента функции
     * 
     * @access public
     * @param integer $msgid номер сообщения, к которому сделан комментарий
     * @param integer $cmtid номер комментария
     * @param boolean $buttons выводить ли кнопки Comment, Edit, Delete на форме
     * @return string html-строка с формой комментария
     */
    public function show_commentary_by_id($msgid, $cmtid, $buttons)
    {
        global $DOF;
        $comment = $DOF->storage('gbcomments')->get_commentary_by_id($msgid, $cmtid);
        ob_start();
        $cmtform = new form_comment(null, array(
            'commentid' => $comment->id,
            'messageid' => $comment->messageid,
            'message'   => $comment->text,
            'author'    => $comment->author,
            'datetime'  => $comment->datetime,
            'buttons'   => $buttons));
        $cmtform->display();
        $html = ob_get_contents();
        ob_end_clean();
        return $html;
    }

}
